#ifndef TPILAPORO_H_
#define TPILAPORO_H_

#include <iostream>
#include "tvectorporo.h"
#include "tporo.h"
using namespace std;
/** \file tpilaporo.h
 *
 * \brief Estructura de la clase TPilaPoro.
 *
 * Definiciones de métodos y atributos de clase TPilaPoro.
 */



/** \brief Clase TPilaPoro.
 *
 * Estructura de la clase TPilaPoro.
 *
 */
class TPilaPoro
{
	/** \brief Sobrecarga del operador "<<", función amiga.
	 *
	 * Función amiga que se encarga de mostrar por pantalla, en un formato determinado un TPilaPoro que le pasemos.
	 *
	 * \param os Ostream donde guardaremos la informacion que queremos mostrar.
	 * \param v TPilaPoro que queremos mostrar.
	 *
	 * \return La funcion devuelve un ostream&.
	 */
	friend ostream & operator<<( ostream &, const TPilaPoro &);

	public:
		/** \brief Constructor de TPilaPoro.
		 *
		 * Constructor de TPilaPoro.
		 */
		TPilaPoro();
		/** \brief Constructor de copia.
		 *
		 * Constructor de copia.
		 * \param t TPilaPoro del que copiamos.
		 */
		TPilaPoro( const TPilaPoro &);
		/** \brief Destructor.
		 *
		 * Destruimos una TPilaPoro.
		 */
		~TPilaPoro();
		/** \brief Sobrecarga del operador asignación.
		 *
		 * Asignamos el contenido del parámetro al objeto que llama al método.
		 * \param t TPilaPoro del cual asignamos.
		 * \return Devuelve un TPilaPoro&.
		 */
		TPilaPoro& operator=( const TPilaPoro &);
		/** \brief Sobrecarga del operador igualdad.
		 *
		 * Devuelve true si las dos TPilaPoro son iguales.
		 * \param t TPilaPoro del cual comprobamos que es igual.
		 * \return Devuelve un bool.
		 */
		bool operator==( const TPilaPoro &);
		/** \brief Metodo EsVacia
		 *
		 * Devuelve true la TPilaPoro esta vacia
		 * \return Devuelve un bool.
		 */
		bool EsVacia() const;
		/** \brief Metodo Apilar
		 *
		 * Apila un TPoro en la TPilaPoro y devuelve true si se ha podido apilar.
		 * \param p TPoro que apilamos.
		 * \return Devuelve un bool.
		 */
		bool Apilar(TPoro &);
		/** \brief Metodo Desapilar
		 *
		 * Desapilar un TPoro en la TPilaPoro y devuelve true si se ha podido desapilar.
		 * \return Devuelve un bool.
		 */
		bool Desapilar();
		/** \brief Metodo Cima
		 *
		 * Desapilar la cima del TPilaPoro.
		 * \return Devuelve un TPoro.
		 */
		TPoro Cima() const;
		/** \brief Metodo Longitud
		 *
		 * Devuelve la longitud de la TPilaPoro
		 * \return Devuelve un int.
		 */
		int Longitud() const;
		/** \brief MSobrecarga del operador suma.
		 *
		 * Devuelve la suma de dos TPilaPoro.
		 * \param t TPilaPoro del que sumamos.
		 * \return Devuelve un TPilaPoro.
		 */
		TPilaPoro operator+( const TPilaPoro &);


	private:
		/** \brief TVectorPoro
		 *
		 * TVectorPoro llamado v
		 */
		TVectorPoro v;
		/** \brief int
		 *
		 * entero llamado posicion
		 */
		int posicion;
		/** \brief TPoro
		 *
		 * TPoro llamado error
		 */
		TPoro error;

};

#endif
